var mySystemPlatform;//手机操作系统
var myCurrentDeviceId;//设备蓝牙mac地址
var myDeviceServiceId;//设备在自己云端的表Id
var myCurrentDeviceLoaclName;//设备蓝牙广播名称，用于ios设备扫描时的鉴别
var myHilinkId;//华为云端分配给设备的唯一Id,先存着，可能以后会用到
var myDeviceMsg;//从自己云端获取的设备信息
var myProdId;//设备的pid
var isScanning=false;//标志现在是否正在扫描
var stopTimerObject;//定时停止扫描的控制对象
var myServiceUrl='http://192.168.0.179:8888',deviceLocalNameArray={'2AKC':1,'2AK9':2,'2AKA':3,'2AKB':4};
var serviceUuid='0000FF0A-0000-1000-8000-00805F9B34FB',writeUuid='0000FF08-0000-1000-8000-00805F9B34FB',notifyUuid='0000FF09-0000-1000-8000-00805F9B34FB';
var deviceLocalHistoryStore=new Array();//储存设备本地历史运动数据的数组
//notify传回信息的回调
function notifyCallback(resultStr){
    var jsonObject=JSON.parse(resultStr);
    console.log(jsonObject['characteristicId']+'的notify传来了数据:'+jsonObject['data']); 
    if(jsonObject['characteristicId'].toUpperCase()==notifyUuid){
        switch(jsonObject['data'][3]){
            case '2'://如果是清除数据的notify
                if (jsonObject['data'][7]=='1'){//清除数据成功           
                    console.log('清除数据成功,现在去执行使用者自己定义的函数');
                    customizeConnectCallback();//全部事情做完之后就调用使用者自定义的函数
                }else                   
                    console.log('清除数据失败');
                break;
            case '0':
                if(jsonObject['data'][2]=='4'){//如果是获取历史数据
                    console.log('startTime: '+jsonObject['data'].substring(6,18));
                    console.log('sportCount: '+jsonObject['data'].substring(30,34));
                    var startTime=transformHexToTime(jsonObject['data'].substring(6,18));
                    var endTime=transformHexToTime(jsonObject['data'].substring(18,30));
                    var sportCount=parseInt(jsonObject['data'].substring(30,34),16);
                    var maxHeartRate=parseInt(jsonObject['data'].substring(38,40),16);
                    var minHeartRate=parseInt(jsonObject['data'].substring(40,42),16);
                    var logObject=new Object();
                    logObject['startTime']=startTime;
                    logObject['endTime']=endTime;
                    logObject['sportCount']=sportCount;
                    logObject['maxHeartRate']=maxHeartRate;
                    logObject['minHeartRate']=minHeartRate;
                    logObject['calorie']=calculateCalorie(sportCount,myDeviceMsg.sex,myDeviceMsg.height,myDeviceMsg.weight,myDeviceMsg.age,deviceLocalNameArray[myProdId],1);//计算消耗卡路里
                    logObject['sportMode']=1;//默认第一种模式
                    deviceLocalHistoryStore.push(logObject);//将历史数据储存在数组里
                }
                break;
            case '1'://如果是说历史数据拿完了
                    console.log('设备本地历史数据采集完毕,现在去清除设备本身储存的历史运动数据');
                    uploadLocalHistoryToMyServer();//历史数据拿完了就上传到自己的云端
                    break;
            case '4'://如果是同步时间完成了的话     
                    if (jsonObject['data'][7]=='1'){//如果同步时间成功的话的话
                        console.log('设备同步时间成功');
                        getDeviceLocalData();//就去获取设备本身的历史运动数据
                    }else
                        console.log('设备同步时间失败');
                    break;  
        }
        customizeNotifyCallback(jsonObject);//使用者自定义的notify回调
    }
}
//写入数据之后完成的回调
function writeDataCallback(errCode){
    if(errCode==0)
        console.log('数据写入成功');
    else
        alert('数据写入失败(内部错误/系统错误)');
}
//服务发现完成之后的回调
function discoverdServiceCallback(resultStr){
    var jsonObject=JSON.parse(resultStr);
    if(jsonObject['errCode']==0){
    	console.log('服务发现成功,现在去注册notify的回调');
        var retCode=window.hilink.notifyBLECharacteristicValueChange (myCurrentDeviceId, serviceUuid, notifyUuid, true);//开启notify
        window.hilink.onBLECharacteristicValueChange('notifyCallback');//注册notify的回调
        console.log('现在去自己的云端获取设备信息');
        Vue.http.get(myServiceUrl+'/deviceMsg/'+myCurrentDeviceId).then(function(res){//去自己云端获取设备信息           
            console.log('去自己的云端获取设备信息成功,现在去同步设备的时间');
            res.body['weight']=res.body['weight'].toFixed(1);
            res.body['height']=res.body['height'].toFixed(1);
            myDeviceServiceId=res.body['id'];//储存设备主键id
            myDeviceMsg=res.body;//储存拿到的设备信息
            app.bodyHeight=res.body['weight'];//身体信息储存到vue对象
            app.bodyWeight=res.body['height'];
            app.age=res.body['age'];
            app.sex=res.body['sex']?1:0;
            synchhDeviceTime();//同步设备时间
        },function(res){
            console.log('去自己的云端获取设备信息失败,返回状态码:'+res.status);
        });  
    }else{
        console.log('发现服务失败,再去连接一次');              
        window.hilink.createBLEConnection(myCurrentDeviceId);
    }
}      
//连接状态发生改变的回调
function connectStageChangeCallback(resultStr){
    var jsonObject=JSON.parse(resultStr);
      	if(jsonObject['connected']){//如果连接成功
            window.hilink.onBLEServicesDiscovered('discoverdServiceCallback');//注册发现完服务之后的回调,要在连接成功之后注册此回调才有用
            console.log('连接成功');
        }else{//如果连接失败就继续去连接设备
            console.log('连接断开,现再去连接一次');
            window.hilink.createBLEConnection(myCurrentDeviceId);
        }
}
//监听扫描设备的回调
function scanCallback(resultStr){
	var jsonObject=JSON.parse(resultStr);
	for(var i=0,length=jsonObject.length;i<length;i++){
		console.log('扫描到一个设备的名称为:'+jsonObject[i].localName+' mac地址为:'+jsonObject[i].deviceId);
		if(mySystemPlatform=='Android'){//如果是android设备就直接比较mac地址就可以了
			if(jsonObject[i].deviceId==myCurrentDeviceId&&isScanning){
				console.log('[android]扫描到目标设备，现在去连接');
				isScanning=false;//修改是否正在扫描的标志位
				window.clearTimeout(stopTimerObject);//停止定时停止扫描的定时任务
				window.hilink.stopBluetoothDevicesDiscovery();//先停止扫描
				window.hilink.onBLEConnectionStateChange('connectStageChangeCallback');//注册连接状态改变之后的回调
        		window.hilink.createBLEConnection(myCurrentDeviceId);//连接设备
			}
		}else{//如果是ios设备不能直接拿mac地址就比较广播的设备名称
			if(jsonObject[i].localName==myCurrentDeviceLoaclName){
				console.log('[ios]扫描到目标设备，现在去连接');
				isScanning=false;//修改是否正在扫描的标志位
				window.clearTimeout(stopTimerObject);//停止定时停止扫描的定时任务
				window.hilink.stopBluetoothDevicesDiscovery();//先停止扫描
				window.hilink.onBLEConnectionStateChange('connectStageChangeCallback');//注册连接状态改变之后的回调
        		window.hilink.createBLEConnection(myCurrentDeviceId);//连接设备
			}
		}
	}
}
//获取用户点击九宫格的设备的回调函数
function getRegisteredCallback(resultStr){
	var jsonObject=JSON.parse(resultStr);
    console.log(resultStr);
    myHilinkId=jsonObject['hilinkDevId'];
    myProdId=jsonObject['hilinkDeviceEntity']['devInfo']['prodId'];//储存设备产品Id
	myCurrentDeviceId=jsonObject['deviceId'];
	myCurrentDeviceLoaclName=jsonObject['deviceName'];
	console.log('用户点击的九宫格的设备名称为:'+myCurrentDeviceLoaclName+' mac地址为:'+myCurrentDeviceId);
    window.hilink.stopBluetoothDevicesDiscovery();//先停止扫描
    window.hilink.onBluetoothDeviceFound('scanCallback');//注册扫描设备的监听
    isScanning=true;//修改是否正在扫描的标志位
    window.hilink.startBluetoothDevicesDiscovery(null,mySystemPlatform=='Android'?true:false,null);//开始扫描设备
    console.log('开始扫描周边设备是否有目标设备');
    stopTimerObject=window.setTimeout(function(){//开启10之后停止扫描的定时任务
    	isScanning=false;
    	window.hilink.stopBluetoothDevicesDiscovery();//先停止扫描
    	console.log('已经达到最大扫描时间，停止扫描');
    }, 10000);
}
//监听手机蓝牙状态改变的回调函数
function bluetoothAdapterStateChangeCallback(resultStr){
	var jsonObject=JSON.parse(resultStr);
    if(jsonObject['available'])//如果蓝牙打开了
        window.hilink.getCurrentRegisteredDevice('getRegisteredCallback');//获取用户点击的九宫格设备信息
    else//如果蓝牙还是没有打开
        var errCode=window.hilink.openBluetoothAdapter();//打开蓝牙
} 
//得知手机蓝牙状态的回调函数
function getBluetoothAdapterStateCallback(resultStr){
   	var jsonObject=JSON.parse(resultStr);
    if(jsonObject['available']){//如果蓝牙打开了
        console.log('手机蓝牙已经打开,现在去获取用户点击的九宫格的设备信息');
        window.hilink.getCurrentRegisteredDevice('getRegisteredCallback');//获取用户点击的九宫格设备信息
    } 
    else{//如果蓝牙未打开
        console.log('手机蓝牙未打开，现在去打开蓝牙');
        window.hilink.onBluetoothAdapterStateChange('bluetoothAdapterStateChangeCallback');//注册蓝牙状态改变的监听
        var errCode=window.hilink.openBluetoothAdapter();//打开蓝牙    
    }
}
//上传设备的历史云端信息到云端
function uploadLocalHistoryToMyServer(){
    console.log('现在去将设备的历史运动信息到自己云端');
    var uploadObject=new Object();
    uploadObject['deviceId']=myDeviceServiceId;//设备表Id
    uploadObject['deviceType']=deviceLocalNameArray[myProdId];//设备类型
    uploadObject['hilinkId']=myHilinkId;//华为云端分配的Id
    uploadObject['toSaveHilinkId']=true;//是否要保存华为云端华为云端分配的Id
    uploadObject['sportLogs']=deviceLocalHistoryStore;//设备本地储存的历史运动记录
    console.log(uploadObject);
    Vue.http.post(myServiceUrl+'/sportLog',uploadObject).then(function(res){//将设备的历史云端信息到自己云端
        console.log('上传设备历史运动数据成功');
        cleanDeiviceLoaclData();//清除设备本地的历史运动记录
    },function(res){
        console.log('上传设备历史运动运动数据失败,返回状态码:'+res.status);
    });
}
//清除设备本身储存的历史数据
function cleanDeiviceLoaclData(){
    console.log('现在去清除设备本身储存的历史运动数据');
    window.hilink.writeBLECharacteristicValue(myCurrentDeviceId, serviceUuid, writeUuid, 'FEA20101', 'writeDataCallback');//清除设备本身储存的历史运动数据
}
//获取设备本身的历史运动数据
function getDeviceLocalData(){
    console.log('现在去获取设备本身储存的历史运动数据');
    window.hilink.writeBLECharacteristicValue(myCurrentDeviceId, serviceUuid, writeUuid, 'FEA10101', 'writeDataCallback');//获取设备本身储存的历史运动数据
}
//将16进制的时间字符串转换为时间字符串
function transformHexToTime(hexString){
    var year=2010+parseInt(hexString.substring(0,2),16);
    var month=parseInt(hexString.substring(2,4),16);
    var day=parseInt(hexString.substring(4,6),16);
    var hour=parseInt(hexString.substring(6,8),16);
    var min=parseInt(hexString.substring(8,10),16);
    var second=parseInt(hexString.substring(10,12),16);
    return year+'-'+formatTime(month)+'-'+formatTime(day)+' '+formatTime(hour)+':'+formatTime(min)+':'+formatTime(second);
}

//将小于10的数字前面添加0
function formatTime(time){
    return time<10?'0'+time:time;
}

//计算消耗的卡路里
function calculateCalorie(sportCount,sex,bodyHeight,bodyHeight,age,devType,sportMode){
    return sportCount*0.75;
}

//同步设备时间
function synchhDeviceTime(){
    var myDate = new Date()
    var year = (myDate.getYear()-110);
    var month = '0'+(myDate.getMonth()+1).toString(16);
    var date = myDate.getDate();
    var hours = myDate.getHours();
    var minutes = myDate.getMinutes();
    var second = myDate.getSeconds();
    var day = myDate.getDay();
    var getDay,getTime;//getDay是星期几，getTime是最后的时间字符串
    if(year < 16)
        year = '0' + year.toString(16);
    else
        year = year.toString(16);
    if(date < 16)
        date = '0' + date.toString(16);
    else
        date = date.toString(16);
    if(hours < 16)
        hours = '0' + hours.toString(16);
    else
        hours = hours.toString(16);       
    if(minutes < 16)
        minutes = '0' + minutes.toString(16);
    else
        minutes = minutes.toString(16);
    if(second < 16)
        second = '0' + second.toString(16);
    else
        second = second.toString(16);
    if(day == 0){
        getDay = day+7;
        getDay = '0'+getDay.toString();
        getTime = year.concat(month,date,hours,minutes,second,getDay);
    }else{
        day = '0'+day.toString();
        getTime = year.concat(month,date,hours,minutes,second,day);
    }
    console.log('开始同步当前时间:'+getTime+' 到设备');
    window.hilink.writeBLECharacteristicValue(myCurrentDeviceId, serviceUuid, writeUuid, 'FEA407'+getTime, 'writeDataCallback');    
}
//提供给使用者的接口
function connectDevice(systemPlatform){
	mySystemPlatform=systemPlatform;
	console.log('获取了手机的设备的设备信息,现在获取手机的蓝牙状态');
    window.hilink.getBluetoothAdapterState('getBluetoothAdapterStateCallback');//获取手机蓝牙状态    
}